import { AXIOS_BASE_URL, AXIOS_TIMEOUT } from '@/config'
import { useUserStore } from '@/stores'
import Axioser from './axioser'
import { openErrorMessage } from '@/helper'
import { useRouter } from 'vue-router'

const EXCEPTION = {
  NO_LOGIN: -1,
  NO_PERMISSION: -2
}

class DefaultAxioser extends Axioser {
  async requestUseFulfilled(config) {
    // 在请求发送前可以进行一些操作，如添加请求头、处理请求参数等
    const token = useUserStore().token

    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }

    return config
  }

  async responseUseFulfilled(response) {
    const { data, headers } = response

    if (headers['content-type'].indexOf('application/json') === -1) {
      // 如果不是 json 格式的数据，直接返回原始响应数据进行处理
      return response.data
    }

    if (!data) {
      openErrorMessage('data为空')
      return
    }

    if (data.code !== 0) {
      openErrorMessage(data.message)
      if (data.code === EXCEPTION.NO_LOGIN) {
        useUserStore().logout()
        useRouter().replace({ name: 'login' })
      }
      return
    }

    return data.data
  }

  async responseUseRejected(error) {
    // error === throw AxiosError(code, config, message, name, request, response, stack)

    // 统一响应错误提示处理
    openErrorMessage(error.message)

    const { status } = error.response
    if (status === 401) {
      // Unauthorized 无效凭证，无法继续保持登录，需要清除当前用户状态，让用户重新登录
      openErrorMessage('无效凭证，请重新登录！')
      useUserStore().logout()
      // router.replace({ name: ROUTER_LOGIN_NAME })
    } else if (status === 500) {
      openErrorMessage('服务错误，请联系管理员重启服务！')
    }

    // 处理响应错误
    return Promise.reject(error)
  }
}

export default new DefaultAxioser({
  baseURL: AXIOS_BASE_URL,
  // 注意：浏览器开启 slow 3g，超时时间太短了，请求所有接口可能会超时导致cancel状态
  // 设置请求的超时时间（以毫秒为单位），这里是10秒
  timeout: AXIOS_TIMEOUT
})
